<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>2022-8-2</title>
  </head>
  <body>
    <script>
      /*
          1. 创建一个对象有那两种方式
           */
      // var obj = {};
      // var obj1 = new Object();

      /*
          2. 请举例说明，对象的基本操作的两种语法
          */
      // var obj = {};
      // var obj1 = new Object();
      //向对象里增加属性和属性值
      //删除对象里的性别属性
      //修改属性值
      //查看obj对象里存储的数据
      // obj.name = '张三';
      // obj.age = 18;
      // obj.sex = '男';
      // delete obj.sex;
      // obj.name = '李四';
      // console.log(obj);
      // //==================第二种
      // obj1['name'] = '王五';
      // obj1['age'] = 19;
      // obj1['sex'] = '女';//增加
      // delete obj1['age'];//删除
      // obj1['name'] = '张三';//修改
      // console.log(obj1);//查看

      /*
          3.对象的curd，两种语法有什么区别
          */
      // 中括号语法:任何时候 场合都可是有 使用范围很广
      // 点语法:较有局限性
      //  符合变量命名规则和规范的键名，两种语法都可以
      //  纯数字只能使用数组关联语法，不能使用点语法
      //  带有特殊符号的，只能使用数组关联语法，不能使用点语法
      /*
          4.对象怎么遍历？那个是键名，那个是键值
          */
      //k 是键名 obj[k]是键值
      //   var obj = {
      //     name: "张三",
      //     sex: "男",
      //     age: "22",
      //   };
      //   for (var k in obj) {
      //     console.log(k, obj[k]);
      //   }

      /*
          5.简单和复杂数据类型在存储上的区别是什么？
          那赋值和比较上的区别又是什么？
          */
      // 首先是复杂数据类型保存在堆内存中，而基本数据类型保存在栈内存中，
      // 然后声明一个复杂数据类型变量中保存的是一个复杂数据类型的地址，基本数据类型保存的是一个具体的值
      // 声明两个复杂数据类型指向同一个地址的时候，改变一个另一个也会跟着改变
      // 简单数据类型比较的是值
      // 而复杂数据类型比较的是地址  地址不相同 就是false

      /*
          6.如下代码会打印什么？请写出分析过程
          */
      var b = "boy";
      console.log(b);
      function fighting() {
        console.log(a);
        console.log(c);
        if (a === "apple") {
          a = "Alice";
        } else {
          a = "Ada";
        }
        console.log(a);
        var a = "Andy";
        middle();
        function middle() {
          console.log(c++);
          var c = 100;
          console.log(++c);
          small();
          function small() {
            console.log(a);
          }
        }
        var c = (a = 88);
        function bottom() {
          b = "baby";
          console.log(b);
        }
        bottom();
      }
      fighting();
      console.log(b);
      //相当于以下代码↓↓↓
      var b;
      function fighting() {
        var a;
        console.log(a); //undefined
        console.log(b); //undefined
        if (a === "apple") {
          a = "Alice";
        } else {
          a = "Ada"; //条件判断 a 不等于 apple 所以走这一条 a = 'Ada'
        }
        console.log(a); //现在a是'Ada'
        a = "Andy"; //这里又给a重新赋值成 'Andy'
        middle();
        function middle() {
          var c;
          console.log(c++); //c只定义没赋值 所以自加1不了 这里就是NaN
          c = 100; //这里又给c赋值了100
          console.log(++c); //100自加1 101
          small();
          function small() {
            console.log(a); //'Andy'
            //↑为什么是'Andy' 因为small这个函数里面没有a变量 所以要去上一级找
            //上一级是middle 也没有 就再去上一级找 fighting里面有a 所以是'Andy'
          }
        }
        var c = (a = 88);
        function bottom() {
          b = "baby";
          console.log(b); //b变量 自己有 就是'baby'
        }
        bottom();
      }
      b = "boy";
      fighting();
      console.log(b); //'boy'
    </script>
  </body>
</html>
